#include "TaskQueue.hh"

TaskQueue::TaskQueue(size_t capacity)
    : _capacity(capacity)
    , _is_exit(false){

}

TaskQueue::~TaskQueue(){

}

TaskQueue::Task TaskQueue::pop(){
    unique_lock ul(_mutex);

    while(Empty() && !_is_exit){
        _not_empty.wait(ul);
    }

    auto ret = _queue.front();
    _queue.pop();
    _not_full.notify_all();

    return ret;
}

void TaskQueue::push(Task& task){
    unique_lock ul(_mutex);

    while(Full()){
        _not_full.wait(ul);
    }
    _queue.push(task);
    _not_empty.notify_all();
}

bool TaskQueue::Full(){
    return _queue.size() == _capacity;
}

bool TaskQueue::Empty(){
    return _queue.empty();
}

void TaskQueue::Set_exit(bool flag){
    _is_exit = flag;
}